package com.atguigu.json;

import com.atguigu.pojo.Person;
import com.atguigu.pojo.PersonListType;
import com.atguigu.pojo.PersonMapType;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.junit.Test;
import java.util.*;

public class JsonTest {
    @Test
    public void test0(){

    }
    @Test
    public void test1(){
        Person person = new Person(1, "刘明福很帅");
        //创建Gson对象实例
        Gson gson=new Gson();
        /**
         *  toJson()：可以将Java对象转换为Json字符串对象
         */
        String s = gson.toJson(person);
        System.out.println(s);
        /**
         *  fromJson():将Json字符串对象转换为Java对象
         */
        Person person1 = gson.fromJson(s, Person.class);
        System.out.println(person1);

    }

    /**
     *  测试将list集合与Json对象之间的互相转换
     */
    @Test
    public void test2(){
        List<Person> personList=new ArrayList<Person>();
        personList.add(new Person(1,"xc"));
        personList.add(new Person(2,"lmf"));
        personList.add(new Person(3,"Jom"));

        Gson gson=new Gson();

        /**
         *    toJson():     将集合list转换为Json对象集合
         */
        String listToJson = gson.toJson(personList);
        System.out.println(listToJson);
        System.out.println("----------------------");

        /**
         *  fromJson():  将Json对象集合转换为Java对象数组
         *  且必须重写一个TypeToken继承类，作为转换的集合类型
         */
        List<Person> jsonToList= gson.fromJson(listToJson, new PersonListType().getType());
        System.out.println(jsonToList);
        System.out.println(jsonToList.get(0));//索引可以从0开始，list集合相当于数组

    }

    /**
     * 测试将 map集合与Json对象集合 之间的互转
     */
    @Test
    public void test3(){
        Map<Integer,Person> map=new HashMap<>();
        map.put(1,new Person(21,"xc"));
        map.put(2,new Person(22,"lmf"));
        map.put(3,new Person(23,"Tom"));

        //将Java集合map转换为Json对象集合
        Gson gson=new Gson();
        String mapToJson = gson.toJson(map);
        System.out.println(mapToJson);
        System.out.println("-----------------------------");
        //将Json对象集合转换为Java集合map
        Map<Integer,Person> jsonToMap= gson.fromJson(mapToJson, new PersonMapType().getType());
        System.out.println(jsonToMap);
        System.out.println(jsonToMap.get(1));//map集合索引不能从0开始，至少wei1
    }

    /**
     *     Json对象集合转换Java集合，另一种方法。使用TypeToken匿名内部类方法
     */
    @Test
    public void test4(){
        Map<Integer,Person> map=new HashMap<>();
        map.put(1,new Person(21,"xc"));
        map.put(2,new Person(22,"lmf"));
        map.put(3,new Person(23,"Tom"));

        //将Java集合map转换为Json对象集合
        Gson gson=new Gson();
        String mapToJson = gson.toJson(map);
        System.out.println(mapToJson);
        System.out.println("-----------------------------");
        //将Json对象集合转换为Java集合map
        /**
         *     Json对象集合转换Java集合，另一种方法。使用TypeToken匿名内部类方法
         */
        Map<Integer,Person> jsonToMap= gson.fromJson(mapToJson, new TypeToken<HashMap<Integer,Person>>(){}.getType());
        System.out.println(jsonToMap);
        System.out.println(jsonToMap.get(1));//map集合索引不能从0开始，至少wei1
    }

}
